DidyMond (Normal User)
Newbie
Messaggi: 16
Iscritto: 22/02/2010
|
Ciao ragazzi!
Vorrei chiedere un parere su questo linguaggio...
Io dovrei acquisire una stringa messa dall'utente solo che non mi è molto chiaro dove va a finire tale stringa cioè, io acquisisco la sringa in questo modo:
Codice sorgente - presumibilmente Plain Text |
.data
stringa: .space 50
[...cut codice...]
li $v0,8 # Predispone la lettura da tastiera
la $a0,stringa
li $a1,50
syscall
|
Quello che mi serve a me, se ho capito finisce in $a0, ma come faccio a riempire un array?
E se poi devo stampare queste stringhe come faccio? Non posso usare il metodo 4 del system service per stampare questa stringa...
Sbaglio io a capire?
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Postato originariamente da DidyMond:
Quello che mi serve a me, se ho capito finisce in $a0
|
$a0 conterrà l'indirizzo del primo carattere della stringa che ti serve. La stringa di per se è da qualche parte in memoria.
ma come faccio a riempire un array?
|
Puoi usare la syscall #9
sbrk 9 number of bytes ($a0) address of block ($v0)
|
http://www.d.umn.edu/~gshute/spimsal/malref.html
Che e' l'equivalente della malloc del C, dopodichè devi iterare per il numero di elementi che vuoi inserire nell'array e con un puntatore inizializzato al primo indirizzo dell'array ($v0) poi incrementi. Se hai delle basi di C sull'aritmetica dei puntatori bene, altrimenti consiglio di documentarti.
E se poi devo stampare queste stringhe come faccio? Non posso usare il metodo 4 del system service per stampare questa stringa...
Sbaglio io a capire? |
Si puoi usare il metodo 4. E' fatto proprio per questo scopo... Ultima modifica effettuata da pierotofy il 24/05/2010 alle 19:19
|
|
DidyMond (Normal User)
Newbie
Messaggi: 16
Iscritto: 22/02/2010
|
Ecco qua, ho aspettato un pò a risponderti perchè ho preferito avere chiarimenti anche dal mio professore...
Mi ha semplicemente detto che utilizzare una stringa sarebbe troppo lungo e rognoso, così mi ha suggerito di utilizzare un codice idenificativo per sapere cosa vuole inserire l'utente!
Beh, così effettivamente è più semplice e sono andato molto più avanti nel progetto!
Ora mi rimane da riordinare gli elementi nell'array (in modo crescente e viceversa) in modo ricorsivo.
E' possibile utilizzare la ricorsione per riordinare?
|
|
crack001 (Normal User)
Rookie
Messaggi: 52
Iscritto: 25/10/2007
|
Certo che puoi usare la ricorsione...devi solo gestirla sull'indice...parti dall'inizio e la richiami con l'indice incrementato...mi raccomando se usi la ricorsione devi utilizzare una funzione, e quindi devi ricordarti di salvare $ra dentro lo stack, io ti consiglio di farti uno schemetto del tuo stack su carta cosi capisci meglio i punti dove ritorni...io ho fatto una cosa simile con la ricerca binaria ma ti viene piu complicato
|
|
DidyMond (Normal User)
Newbie
Messaggi: 16
Iscritto: 22/02/2010
|
Allora...piano piano ci sto riuscendo; riesco a riordinare un array ricorsivamente...
Però, quello che ora mi chiedo è se è possibile "associare" due array in quanto ho:
array1-->Prodotti (non stringhe ma codici)
array2-->Prezzi (floating)
Se io eseguo il sorting su array1 mi restituisce i codici prodotti ordinati, però se io devo stampare a video un "riepilogo" il prezzo-prodotto non corrisponde più
Non è che sia possibile "associare" i due array, cioè se io effettuo uno scambio nei prodotti mi scambia anche i prezzi?
come dovrei passare i dati al sorting?
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Nella procedura di sorting, quando scambi gli elementi dell'array prodotti scambia gli elementi corrispettivi dell'array prezzi. Ad esempio se stai scambiando il prodotto i con quello j, scambia anche il prezzo i con quello j.
|
|
DidyMond (Normal User)
Newbie
Messaggi: 16
Iscritto: 22/02/2010
|
Postato originariamente da pierotofy:
Nella procedura di sorting, quando scambi gli elementi dell'array prodotti scambia gli elementi corrispettivi dell'array prezzi. Ad esempio se stai scambiando il prodotto i con quello j, scambia anche il prezzo i con quello j. |
Questo però vuol dire che per ogni operazione che faccio nel sorting dei prodotti lo devo fare anche in quello dei prezzi e quindi supponendo che:
Codice sorgente - presumibilmente Altri Linguaggi |
$t0->indirizzo base di array Prodotti
$t1->indirizzo base di array Prezzi
Operazioni come queste (che nel sorting mi servono per avanzare di indice)
addi $t0, $t0, 4
Dovrei aggiungere anche
addi $t1, $t1, 4
|
Giusto? Il problema è che i registri scarseggiano perchè comunque dovrei prelevare sia i dati dell'array Prodotti che quello dei prezzi...o no? |
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Posta il codice completo... altrimenti non ti si può spiegare cosa bisogna fare; per la mancanza di registers io di solito risolvo utilizzando lo stack per allocare tutte le variabili locali (e anche per passare i parametri alle funzioni...)
Come in questo esempio: http://www.pierotofy.it/pages/sorgenti/dettagli/18486-Impl ...
All'inizio della tua procedura:
Codice sorgente - presumibilmente Plain Text |
addi $sp, $sp, -4
sw $s0, 0($sp)
move $s0, $sp
# Create stack frame
addi $sp, $sp, -4
|
$s0 diventa il tuo "base pointer" che ti servirà da "puntatore di base" per accedere alle variabili locali. Dopodichè puoi utilizzare -4($s0) per fare utilizzare una variabile da 4 bytes. Ma ne puoi allocare quante ne vuoi. Ad esempio modificare:
Codice sorgente - presumibilmente Plain Text |
# Create stack frame
addi $sp, $sp, -4
|
Con:
Codice sorgente - presumibilmente Plain Text |
# Create stack frame
addi $sp, $sp, -12
|
Ti permette di utilizzare tre variabili da 4 bytes (oppure 1 da 12).
Per accedere alle variabili tramite lo stack:
Codice sorgente - presumibilmente Plain Text |
Poi prima di uscire dalla procedura è importante deallocare lo stack:
Codice sorgente - presumibilmente Plain Text |
move $sp, $s0
lw $s0, 0($sp)
addi $sp, $sp, 4
|
Leggiti bene l'esempio che ho linkato e fatti uno schemino a matita dello stack, passo per passo come viene eseguito. Se analizzi bene il programma riuscirai anche a capire come è possibile passare parametri tramite lo stack. Ultima modifica effettuata da pierotofy il 05/06/2010 alle 2:07
|
|
DidyMond (Normal User)
Newbie
Messaggi: 16
Iscritto: 22/02/2010
|
Postato originariamente da pierotofy:
Posta il codice completo... altrimenti non ti si può spiegare cosa bisogna fare |
|
|